package com.sicpa.system.service;

import com.sicpa.common.core.domain.AjaxResult;
import com.sicpa.common.core.domain.entity.AntiCounterfeitingRegisteredOffice;
import com.sicpa.common.core.domain.entity.AssuranceBusinessDataReport;
import com.sicpa.common.core.domain.entity.AssuranceBusinessDataReportTemp;
import com.sicpa.common.core.domain.model.LoginUser;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * IAssuranceBusinessDataReport
 *
 * @author lwf
 */
public interface IAssuranceBusinessDataReportService {

    /**
     * 鉴证业务数据保存草稿
     * @param report
     * @return
     */
    Long saveDraft(AssuranceBusinessDataReport report);

    /**
     * 对比修改鉴证业务报告
     * @param assuranceBusinessDataReport
     * @return
     */
    AjaxResult compareEdit(AssuranceBusinessDataReport assuranceBusinessDataReport);

    /**
     * 新增鉴证业务报告
     *
     * @param assuranceBusinessDataReport
     * @return
     */
    AjaxResult insertReport(AssuranceBusinessDataReport assuranceBusinessDataReport);

    /**
     * 新增鉴证业务报告
     * @param assuranceBusinessDataReport
     * @param dataStatus
     * @return
     */
    AjaxResult insertReport(AssuranceBusinessDataReport assuranceBusinessDataReport,String dataStatus);

    /**
     * 根据鉴证业务数据报告id获取详细信息
     *
     * @param businessId
     * @return
     */
    AssuranceBusinessDataReport selectReportByBusinessId(Long businessId);

    /**
     * 判断在事务所登陆 下读取数据是否为本事务所数据
     *
     * @return
     * @pararm assuranceBusinessDataReport
     */
     int isOfficeData(AssuranceBusinessDataReport assuranceBusinessDataReport);

    /**
     * 鉴证业务历史数据导出
     * @param businessId
     * @return
     */
    List<AssuranceBusinessDataReport> importEditHistory(Long businessId);

    /**
     * 组长查询
     * @param assuranceBusinessDataReport
     * @param list
     * @return
     */
    List<AssuranceBusinessDataReport> zeSelect(AssuranceBusinessDataReport assuranceBusinessDataReport, List<String> list);

    /**
     * 获取用户事务所
     */
    AntiCounterfeitingRegisteredOffice getOfficeByNum();

    /**
     * 普通查询
     * @param assuranceBusinessDataReport
     * @param antiCounterfeitingRegisteredOffice
     * @return
     */
    List<AssuranceBusinessDataReport> puSelect(AssuranceBusinessDataReport assuranceBusinessDataReport,AntiCounterfeitingRegisteredOffice antiCounterfeitingRegisteredOffice);

    /**
     * 上注协和财政
     * @param assuranceBusinessDataReport
     * @param isFin
     * @return
     */
    List<AssuranceBusinessDataReport> scipaSelect(AssuranceBusinessDataReport assuranceBusinessDataReport,boolean isFin);

    /**
     * 删除鉴证业务数据报告
     *
     * @param businessIdS
     * @return
     */
    int deleteDeptByBusinessId(String businessIdS);

    /**
     * 获取鉴证业务数据报告草稿
     *
     * @param assuranceBusinessDataReport
     * @return
     */
    List<AssuranceBusinessDataReport> selectReportListDraft(AssuranceBusinessDataReport assuranceBusinessDataReport);

    /**
     * 申请财政退回
     *
     * @param businessId
     * @param reason
     * @return
     */
    int back(Long businessId, String reason);

    /**
     * 获取申请财政退回数据数量
     * @return
     */
    List<AssuranceBusinessDataReport> selectApprovalReportCount(AssuranceBusinessDataReport report);

    /**
     * 作废数据
     *
     * @param ids
     * @param reason
     * @return
     */
    AjaxResult voidBusinessData(String ids, String reason);

    /**
     * 退回通过/不通过
     *
     * @param assuranceBusinessDataReport
     * @return
     */
    AjaxResult backPassOrNoPass(AssuranceBusinessDataReport assuranceBusinessDataReport);

    /**
     * 预上传字段配置
     *
     * @param configJson
     */
    void preUploadConfig(String configJson);

    /**
     * wym，路径1，上注协鉴证业务数据报告excel导入
     * 导入时对数据的判定条件如下：
     * 1、校验必填字段是否有缺失，有缺失直接判断失败
     * 2、查询事务所名称是否已经存在系统中
     * 事务所不存在直接判定失败
     * 3、查询数据库中是否存在相同报备编码的记录
     * 存在则忽略该条数据
     * 4、查询数据库中是否存在相同报告文号的数据
     * 4.1、若存在报告文号相同，且数据库中数据是由事务所导入的数据，则判断两份数据的主要字段是否一致，对主表数据进行匹配结果标记
     * 4.2、若报告文号不相同，则查询该条数据的：“审计年度”+“报备类型”+“客户名称（被审验单位名称）/客户营业执照”，
     * 若数据库存在以上字段一致，且事务所不一致的数据时，将该条数据存入数据库中，但状态标记为异常
     *
     * 采用异步方式处理，并返回交易号，前端使用交易号查询任务进度
     *
     * @param assuranceBusinessDataReports 数据集
     * @param taskNo 任务编号
     * @return
     */
    void siaImportReport(List<AssuranceBusinessDataReport> assuranceBusinessDataReports, String taskNo, LoginUser loginUser);

    /**
     * 传递任务编号，查询导入任务的实时进展，返回的map中包含以下内容
     * taskNo：原样返回任务编号
     * stageNum：任务一共分几个阶段
     * stageDetail：每个阶段的文字描述，如，"导入前准备" ,"数据必填字段校验" ,"事务所名称校验" ,"报备编码过滤","数据入库处理","导入完成"
     * currentStage：任务当前进展到第几阶段
     * taskStatus：任务状态，0执行中，1正常结束，2任务异常结束
     * finishMessage：当任务执行结束（不管是否正常），会返回结束的结果说明
     *
     * @param taskNo 任务编号
     * @return
     */
    Map<String,Object> getImportProgressByTaskNo(String taskNo);

    /**
     * 数据状态：0：不予报备，1：强审通过
     *
     * @param businessId
     * @param dataStatus
     * @return
     */
    int noFilingOrCompulsoryApproval(Long businessId, int dataStatus,String strongReason);

    /**
     * 申请退回列表页
     *
     * @param assuranceBusinessDataReport
     * @return
     */
    List<AssuranceBusinessDataReport> listApproval(AssuranceBusinessDataReport assuranceBusinessDataReport);

    /**
     * 根据防伪编码获取鉴证业务数据报告
     *
     * @param antiCounterfeitingCoding
     * @return
     */
    AssuranceBusinessDataReport getAssuranceBusinessDataReport(String antiCounterfeitingCoding);

    /**
     * 获取审批不通过原因
     * @param businessId
     * @return
     */
    String getFailedReason(Long businessId);

    /**
     * 获取作废原因
     * @param businessId
     * @return
     */
    String getVoidReason(Long businessId);

    /**
     * 获取申请财政退回原因
     * @param businessId
     * @return
     */
    String getApplyReturnReason(Long businessId);

    /**
     * 获取申请财政退回不通过原因
     * @param businessId
     * @return
     */
    String getApplyReturnNoReason(Long businessId);

    /**
     * 获取鉴证业务报告修改历史
     * @param businessId
     * @return
     */
    List<AssuranceBusinessDataReportTemp> getEditHistoryByBusinessId(Long businessId);

    /**
     * 上证所录入鉴证业务数据
     * @param report
     * @return
     */
    AjaxResult scipaSave(AssuranceBusinessDataReport report);

    /**
     * 检查事务所名称
     * @param firmName
     * @return
     */
    Long checkFirmName(String firmName);

    /**
     * 事务所预上传录入数据
     * @param report
     * @return
     */
    AjaxResult preUploadSave(AssuranceBusinessDataReport report);

    /**
     * 事务所数据比对导入
     *
     * @param list
     * @return
     */
    Map<String, Object> officeImport(List<AssuranceBusinessDataReport> list);

    /**
     * 预上传事务所业务数据导入
     * @param list
     * @return
     */
    Map<String, Object> preUploadImport(List<AssuranceBusinessDataReport> list);

    /**
     * 根据鉴证业务表id获取录入数据和导入数据
     *
     * @param businessId 鉴证业务表id
     * @return 鉴证业务表报告录入数据和导入数据
     * @author wph 20200917
     */
    AjaxResult getTempAndBusinessData(Long businessId);

    /**
     * 审核鉴证业务数据
     *
     * @param report 鉴证业务数据报告
     * @author wph 20200921
     */
    AjaxResult auditImportReport(AssuranceBusinessDataReport report);

    /**
     * 事务所数据比对导入 事务所业务数据预上传补充
     * @param list
     * @return
     */
    Map<String, Object> preUploadImportSupplement(List<AssuranceBusinessDataReport> list);

    /**
     * 获取待办事项  总数据（财政退回业务数据，需审核事务所业务数据，外省注册事务所审核数据，事务所联系人申请修改数据）
     */

    HashMap<String,Integer> getApproveCount() ;


    /**
     * 20201113，wym，根据传递的报告id数组，将这些报告生成pdf和图片，并返回图片base64字符串列表
     * @param ids
     * @return
     */
    Map<String, Object> getReportImgsByIds(String[] ids);

    /**
     * 20201113，wym，根据传递的报告id数组，将这些报告生成pdf，并将pdf压缩为zip，返回zip的文件流
     * @param ids
     * @return
     */
    Map<String, byte[]> getReportZipByIds(String[] ids);



}
